Repository navigation
fix(benchmark): explicitly continue repaired quota failures on the original session - #8217
Conversation
huangruiteng
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; model=gpt-6-astra; provider=OpenAI; reasoning_effort=ultra; declaration_source=runtime_reported.
动机 / Motivation
实验运营者在订阅额度恢复后,需要接着完成原来未完成的实验。旧外部调度器仍把已返回的额度失败保持在停止状态,没有共享 Turn 已有的显式重试入口;手工清空失败或新建会话会丢失故障和预算依据。此改动让运营者绑定这一次失败、原会话及独立批准的有限时间,再进入普通调度。它保留原失败和尝试次数,不负责重建已删除的工作区,也不自动增加评分机会。完整旧工作区缺失的实验仍不能直接恢复。
改动思路 / Approach
现有入口 benchmark.runtime.scheduler 接收失败状态摘要,而不是新增恢复守护进程。摘要表达明确的本次重试意图;历史、Goal 和账号观察来自已有事实。TypeScript 的 hostFailureRetryCheck 统一决定失败能否显式重试,Python 只负责文件、进程及原生客户端读取。账号容量判断复用现有可选 provider,既不轮换账号也不购买容量。
关键边界是先证明原进程已退出、原会话和配置未改变,再只读确认原生末轮确为额度失败并检查当前容量。通过后追加有限新阶段,随后照常接受 Stop、工作准入和未结算 replan 的约束。重复同一请求只能返回同一阶段,不能清掉其后的新失败。该分层保留旧协议读回,同时避免在 benchmark 里再写一份通用失败决策;当前 PR 只完成原文件系统内的显式失败接续,不承担完整丢失数据恢复或自动补时服务。
具体改动 / Changes
审查头 d442384c8259c56bbe63709b0b76106db07b5e04,基线 1a309ccb3278b68f79d674b66833fadffd8ad476。14 个文件,新增 631 行、删除 45 行;其中生产代码新增 285/删除 42,测试新增 295/删除 3,文档新增 51。共同规则从既有 Turn Journal 提取,原调度与自动重试默认值未改变。
关键代码讲解
hostFailureRetryCheck保留自动重试次数上限,并继续拒绝盲目重放输出预算耗尽;效果运行时严格验证意图布尔值和失败结构。read_failed_host关联唯一返回回执、进程终止窗口及当前绑定,检查容量前后重新执行 Goal 准入,并核对原状态没有被并发改变。native_failed_turn只读完整原生历史,拒绝未知错误、未完成效果或变化的历史;保留 failed 状态,不冒充 completed checkpoint。resume_state_file按有限截止选择追加阶段,保留会话、失败次数和 replan 记录;相同请求不能延长阶段或擦掉后续失败。
验收依据为既有恢复契约 https://github.com/loopx-project/loopx/blob/1a309ccb3278b68f79d674b66833fadffd8ad476/benchmark/README.md#continue-an-interrupted-host-in-its-retained-filesystem ,固定修订 1a309ccb3278b68f79d674b66833fadffd8ad476。对应 original-state:保留原文件、会话及失败,已实现并由真实 SQLite/worker 子进程用例验证;finite-phase:新阶段有限且重复请求不能补充时间,已实现;normal-admission:下一轮仍受 Stop、配置和 replan 约束,已实现。以上是审查对原契约三段要求的索引,不是新产品协议。跨容器完整恢复、丢失文件修复及科学分数收益不在本次实现范围。
对主干的风险 / Risks
最危险的回归是重复恢复请求把新的失败清掉,从而不断执行或重置次数。本次实际运行生产调度器、真实 SQLite 和原生协议替身,覆盖首次失败、重复失败、另一次明确修复、原会话继续工作,以及准备前后 Stop。独立执行新增 33 项全部 PASS;有意把恢复次数改为零时,同一生产路径的断言 FAIL,证明该用例能识别次数丢失。正常原生付费模型和线上历史实验完整恢复未执行,不能从这些测试推出得分提升。
默认关闭证据包括基线和当前头 9 组完整 Turn 决策相同、自动 quota 仍不重试、默认 readiness 行为未改;新增的 CLI help/README 仅解释显式入口,不会进入自动模型提示。作者相关回归 249 项 PASS、1 可选跳过;最终 focused 72 项 PASS、3 可选 SDK 跳过,最终 owner/journal 65 项 PASS。Premerge 直接 6 项和选中 19 项均 PASS,但 benchmark-sensitive 总状态仍是 manual_review_required,不等于允许合并。
语义与 CI 对齐
新增的是现有失败枚举与 Turn 决策的调用入口;没有按错误文案子串判断重试资格,也没有把 benchmark 术语写进通用规则。外部容量仅是当前观察,不是未来容量保证;后续失败仍需新的显式决定。按照当前 review 契约不查询或等待远端 CI。缺少可选原生 provider、未知容量、变更绑定或缺失完整源时均保持停止,不能用旧 checkpoint 绕过。部署时必须保留这项可选依赖和原始文件系统。
我的整体评价 / Verdict
该切片是 justified_increment:已经打通可验证的原会话有限接续,长程连续性与运营恢复体验均改善;当前不需要新增界面设置或反复确认。保留 legacy 停止容器适配是因为存在持久化旧回执,不能只因请求端同步发布就删除其读取能力。实现范围与持续停机和历史丢失风险相称,共用 TypeScript 决策是本批最有价值的简化。
本次没有渲染页面变更,视觉评审不适用;未验证范围是线上完整历史数据恢复与最终分数收益。最新完整工作区和评分机会的联合资格仍由既有恢复流程负责,缺失时继续阻塞。没有发现当前精确头的阻断缺陷;审批不代表 main 合并、线上安装或旧实验恢复已经完成。
English verdict: APPROVE d442384c8259c56bbe63709b0b76106db07b5e04 for the bounded explicit same-session continuation; historical source recovery, deployment qualification and merge authorization remain separate.
huangruiteng
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; model=gpt-6-astra; provider=OpenAI; reasoning_effort=ultra; declaration_source=runtime_reported.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
实验运营者在订阅额度恢复后,需要接着完成原来未完成的实验。旧外部调度器仍把已返回的额度失败保持在停止状态,没有共享 Turn 已有的显式重试入口;手工清空失败或新建会话会丢失故障和预算依据。此改动让运营者绑定这一次失败、原会话及独立批准的有限时间,再进入普通调度。它保留原失败和尝试次数,不负责重建已删除的工作区,也不自动增加评分机会。完整旧工作区缺失的实验仍不能直接恢复。
改动思路 / Approach
现有入口 benchmark.runtime.scheduler 接收失败状态摘要,而不是新增恢复守护进程。摘要表达明确的本次重试意图;历史、Goal 和账号观察来自已有事实。TypeScript 的 hostFailureRetryCheck 统一决定失败能否显式重试,Python 只负责文件、进程及原生客户端读取。账号容量判断复用现有可选 provider,既不轮换账号也不购买容量。
关键边界是先证明原进程已退出、原会话和配置未改变,再只读确认原生末轮确为额度失败并检查当前容量。通过后追加有限新阶段,随后照常接受 Stop、工作准入和未结算 replan 的约束。重复同一请求只能返回同一阶段,不能清掉其后的新失败。该分层保留旧协议读回,同时避免在 benchmark 里再写一份通用失败决策;当前 PR 只完成原文件系统内的显式失败接续,不承担完整丢失数据恢复或自动补时服务。
具体改动 / Changes
审查头 d442384c8259c56bbe63709b0b76106db07b5e04,基线 1a309ccb3278b68f79d674b66833fadffd8ad476。14 个文件,新增 631 行、删除 45 行;其中生产代码新增 285/删除 42,测试新增 295/删除 3,文档新增 51。共同规则从既有 Turn Journal 提取,原调度与自动重试默认值未改变。
关键代码讲解
hostFailureRetryCheck保留自动重试次数上限,并继续拒绝盲目重放输出预算耗尽;效果运行时严格验证意图布尔值和失败结构。read_failed_host关联唯一返回回执、进程终止窗口及当前绑定,检查容量前后重新执行 Goal 准入,并核对原状态没有被并发改变。native_failed_turn只读完整原生历史,拒绝未知错误、未完成效果或变化的历史;保留 failed 状态,不冒充 completed checkpoint。resume_state_file按有限截止选择追加阶段,保留会话、失败次数和 replan 记录;相同请求不能延长阶段或擦掉后续失败。
验收依据为既有恢复契约 https://github.com/loopx-project/loopx/blob/1a309ccb3278b68f79d674b66833fadffd8ad476/benchmark/README.md#continue-an-interrupted-host-in-its-retained-filesystem ,固定修订 1a309ccb3278b68f79d674b66833fadffd8ad476。对应 original-state:保留原文件、会话及失败,已实现并由真实 SQLite/worker 子进程用例验证;finite-phase:新阶段有限且重复请求不能补充时间,已实现;normal-admission:下一轮仍受 Stop、配置和 replan 约束,已实现。以上是审查对原契约三段要求的索引,不是新产品协议。跨容器完整恢复、丢失文件修复及科学分数收益不在本次实现范围。
对主干的风险 / Risks
最危险的回归是重复恢复请求把新的失败清掉,从而不断执行或重置次数。本次实际运行生产调度器、真实 SQLite 和原生协议替身,覆盖首次失败、重复失败、另一次明确修复、原会话继续工作,以及准备前后 Stop。独立执行新增 33 项全部 PASS;有意把恢复次数改为零时,同一生产路径的断言 FAIL,证明该用例能识别次数丢失。正常原生付费模型和线上历史实验完整恢复未执行,不能从这些测试推出得分提升。
默认关闭证据包括基线和当前头 9 组完整 Turn 决策相同、自动 quota 仍不重试、默认 readiness 行为未改;新增的 CLI help/README 仅解释显式入口,不会进入自动模型提示。作者相关回归 249 项 PASS、1 可选跳过;最终 focused 72 项 PASS、3 可选 SDK 跳过,最终 owner/journal 65 项 PASS。Premerge 直接 6 项和选中 19 项均 PASS,但 benchmark-sensitive 总状态仍是 manual_review_required,不等于允许合并。
语义与 CI 对齐
新增的是现有失败枚举与 Turn 决策的调用入口;没有按错误文案子串判断重试资格,也没有把 benchmark 术语写进通用规则。外部容量仅是当前观察,不是未来容量保证;后续失败仍需新的显式决定。按照当前 review 契约不查询或等待远端 CI。缺少可选原生 provider、未知容量、变更绑定或缺失完整源时均保持停止,不能用旧 checkpoint 绕过。部署时必须保留这项可选依赖和原始文件系统。
我的整体评价 / Verdict
该切片是 justified_increment:已经打通可验证的原会话有限接续,长程连续性与运营恢复体验均改善;当前不需要新增界面设置或反复确认。保留 legacy 停止容器适配是因为存在持久化旧回执,不能只因请求端同步发布就删除其读取能力。实现范围与持续停机和历史丢失风险相称,共用 TypeScript 决策是本批最有价值的简化。
本次没有渲染页面变更,视觉评审不适用;未验证范围是线上完整历史数据恢复与最终分数收益。最新完整工作区和评分机会的联合资格仍由既有恢复流程负责,缺失时继续阻塞。没有发现当前精确头的阻断缺陷;审批不代表 main 合并、线上安装或旧实验恢复已经完成。
English verdict: APPROVE d442384c8259c56bbe63709b0b76106db07b5e04 for the bounded explicit same-session continuation; historical source recovery, deployment qualification and merge authorization remain separate.
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max.
动机 / Motivation
持有完整失败研究现场的操作者,在账户额度修复后需要继续原来未完成的工作。 旧外层调度器在额度修复后仍保持硬配额失败;本头允许绑定这一次失败和原会话,在另行获准的有限阶段继续工作,同时保留旧失败和尝试次数。 手工清空失败或新建会话会损失归因和预算依据,继续停住则无法利用已修复的现场。真实 SQLite、生产 worker 子进程与本地确定性 native 协议流程完成同会话后续工作;重复请求、后来失败、Stop 和阶段耗尽均不能清除原记录或补充时间。 本 PR 不重建丢失现场、不把 failed 尾部当作 completed checkpoint,不授予账户、预算、执行或合并权限,也不证明线上模型恢复和科学分数收益。 真实历史现场的正向恢复、安装采用、真实模型与完整科学成本收益仍需原运行和 native qualification owner 单独验收。
改动思路 / Approach
显式重试意图无法从额度可用推导;资格判断复用共享 TypeScript owner,进程、文件和账号读取留在现有 provider,有限阶段与历史留在原调度器,避免另建恢复决策 owner。 当前 PR 只交付保留现场内的一次精确硬配额失败接续,打通原会话的有限后续工作;默认自动重试、completed checkpoint 和原语义 replan owner 保持原边界。 不改动的代价是无法从已修复的配额失败继续;只删除 scheduler 的失败标记会绕过来源、会话、当前 Stop 和有限时间。已有 interrupted-Host 路径负责预算中断,不能用它把 quota failed 假装成已完成 checkpoint。这里复用其文件锁、原始来源、完整 native history 和 phase 机制,扩展一个明确的调用分支。
资格检查只决定能否准备阶段,普通下一轮仍决定是否执行。来源 digest 可由现有状态自动计算;已知 Goal、session、配置继续沿用,不增加新 Goal、登录切换或确认回合。操作者仍需真实修复账户并提供原本独立批准的有限余量;这个 consequential decision 不能由“额度看起来可用”替代。
具体改动 / Changes
审查完整基线 1a309ccb3278b68f79d674b66833fadffd8ad476 到精确头 d442384c8259c56bbe63709b0b76106db07b5e04,实际 PR base 为 codex/edgebench-integration-r30-20261107。14 路径新增631/删除45:10个生产路径285+/42−、3个测试路径295+/3−、1个文档路径51+。完整差异与两个既有作者 review 已读;它们是证据输入,没有继承其批准。此前集成版的14个组件文件、frozen source 与依赖声明在本头相同,但本轮在独立 checkout 重新执行实际入口和对照。
关键代码讲解
hostFailureRetryCheck从原 Journal 提取现有显式重试规则。自动 quota 不重试,output budget 不盲重放,retryable 错误仍受次数限制;新 Effect 入口拒绝缺失意图、字符串布尔、未知字段和畸形失败。Python 只调用该 owner,不复制通用决定。read_failed_host将状态 digest、唯一返回 wake、已结束进程组、原 session/profile 和 native failed 尾部绑定;账号观察前后都检查当前准入,最后重读原始字节。只留下有界 availability 观察,不输出账号、令牌或原始响应。native_failed_turn复用既有完整 history reader,要求结构化 quota 错误、正确进程窗口、无 pending effects,重读历史一致。它只观察 failed,原 completed-checkpoint gate 继续拒绝同一尾部。resume_state_file在现有独占锁中追加 hash 绑定的有限 phase,保留原失败、attempt 和 replan。相同请求返回相同阶段,即使其中已有新的失败也不擦除;后来的修复必须重新绑定那个失败。生产 worker 下一次 attempt 从保留计数增加。
验收依据 benchmark/README.md,固定修订 1a309ccb3278b68f79d674b66833fadffd8ad476,以改动前的“Continue an interrupted Host in its retained filesystem”原契约为准,而非新增的解释反证自身。original_session:保留 scheduler attempt、wake、Goal/Todos/native conversation,已实现;finite_phase:追加阶段并禁止重放补时,已实现;current_admission:下一轮维持 quota、Stop、profile/session 检查,已实现;semantic_replan:未结算 replan 仍由原 owner 处理,已实现;transport_only:不授予 evaluator、执行或科学可比性,保持现有边界。对应证据是本轮真实 SQLite/worker 流程、反例和9组共享决策对照。
对主干的风险 / Risks
最强反例是首次恢复成功后,同一个旧 digest 反复擦除后来失败或把 attempt 重置为零。生产流程先返回一次 quota 失败、准备阶段、再次失败并保持 attempt=2;重放旧请求保留阶段字节,随后另一次绑定新失败的明确修复才让原 session 完成工作。故意把恢复计数改成0时,同一实际路径在 recovered_attempt_count == 1 断言得到预期 FAIL,原始失败记录保留;未修改产品代码或放宽断言。额外两个并发反例覆盖额度观察成功后的 Stop 与截止耗尽,均拒绝新阶段且原失败字节不变。
本轮 PASS:224项 Python,2项独立并发反例,60项 TypeScript,共享 turn_journal.inspect 的9组 base/head 完整结果逐项一致且零归一化。Python SKIP 保留4项:3项缺可选 SForge SDK,1项显式真实 Docker qualification;legacy quota 分支经过真实文件清单和消费方检查、Docker transport 使用本地替身,不能宣称本轮真实 Docker 恢复成功。共享 TS typecheck 和 premerge 的6项直接、4项选中检查均通过;总体仍为 manual_review_required 的 benchmark hold,exit1没有改写成 merge gate 通过。按当前策略未查询或等待远端 CI。
默认路径未添加 required fields、自动重试、账号轮换或额外 quota spend。require_allowance=false 的旧 readiness 用例与普通 scheduler/Host/replan 回归通过;新增 README/CLI help 只解释显式操作,不是自动加载 prompt/skill。缺 provider、未知或耗尽额度、错误 session/profile/digest、活动进程、变化历史、未知错误与未结算 replan 仍保持原失败。账号可用只是观察,不预留将来容量。回退可撤销这一显式入口,旧失败和追加阶段继续保留给原 owner 检查。
语义与 CI 对齐
共享 loopx_turn_host_failure_v0 枚举与 Journal 的决定含义复用原词表;host_failure.retry 暴露原决策的有类型入口,failed_host_recovery 是原 scheduler 的派生来源记录,没有第二套通用生命周期。没有根据错误 prose 子串猜测 quota,没有把 benchmark 专用义务写进通用 Goal/quota/Todo 规则,也没有将强制准入称作建议。语义、编译、公共边界和现有 ratchet 检查通过;不放松科学门槛或原始预算。当前不触及 PostgreSQL authority owner。
我的整体评价 / Verdict
交付判断 justified_increment。long_horizon=improved 指已验证的失败保留、同会话有限后续工作;user_experience=improved 指操作者可沿已有入口修复并继续,所需额外输入来自真实缺失的 repair intent 和独立预算授权。没有从测试数量推断长期净收益。显式重试意图无法从额度可用推导;资格判断复用共享 TypeScript owner,进程、文件和账号读取留在现有 provider,有限阶段与历史留在原调度器,避免另建恢复决策 owner。 当前 PR 只交付保留现场内的一次精确硬配额失败接续,打通原会话的有限后续工作;默认自动重试、completed checkpoint 和原语义 replan owner 保持原边界。
兼容性保留给已存在的 persisted failure、phase 和停止容器证据;删除这些 reader 会把完整旧现场变成不可用,不能以版本同步替代历史读取。共用 TypeScript predicate、移除 Journal 重复分支是适用且已覆盖 parity 的同域简化;新建通用恢复框架或整条语言重写没有本次需要。本头没有修改渲染页面;检查了 benchmark scheduler CLI、README、账号观察与 worker 失败读回,并搜索了既有 App/capability 消费方,当前是专用实验操作者入口。 未验证范围:安装态前端、真实账号修复、真实 Docker 失败现场和线上历史模型恢复未由本次本地检查认证。 真实历史现场的正向恢复、安装采用、真实模型与完整科学成本收益仍需原运行和 native qualification owner 单独验收。 本轮未发现当前精确头的阻塞问题;批准与合并、安装和实际实验恢复授权分别处理。
English verdict: APPROVE d442384c8259c56bbe63709b0b76106db07b5e04 for bounded explicit same-session continuation; live historical recovery, scientific benefit and maintainer merge authorization remain separate.
…ed sessions Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> (cherry picked from commit d442384) Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
d442384 to
8bc878b
Compare
|
This pull request has merge conflicts with Choose the remote for the base repository, not an out-of-date fork. git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEADFor a same-repository clone whose Keep the DCO |
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · OpenAI · gpt-6.1-sol · runtime_reported · max
Request changes
[P1] 显式失败恢复在缺少原失败时派发普通 Host。显式给出符合格式的 --retry-failed-state-sha256,状态路径缺失,或输入精确绑定只有 {} 的初始状态。。用独立 SQLite 运行时、真实调度器与 worker 及隔离 native stand-in,两个输入各启动一个 Host 并写一条 wake receipt,均没有恢复阶段。第一处返回跳过失败检查,CLI 随即正常启动 worker。。显式模式在缺少来源、来源不可读、失败记录无效或拿不到阶段锁时终止,先确认已校验的同阶段重放或新恢复阶段,再交给 worker。为缺失源和 SHA 匹配的空状态添加 CLI 回归,断言零次 native 调用、零条唤醒收据和零个新阶段。。
动机 / Motivation
使用 benchmark scheduler 继续已失败实验的操作员需要在账号配额恢复后,保留原实验会话、工作与已发生的成本。 旧调度器遇到硬配额失败时会保持阻断。新流程旨在让操作者指明那次失败,经来源与配额检查后继续原会话。当前缺失来源时仍可能误发一个普通唤醒。 一个已验证的返回失败产生绑定原记录和截止时间的新阶段。缺失或无效原记录应拒绝请求,现有 head 会在部分情况下启动普通工作。 本次范围是显式调度器恢复及其只读见证。推理、真实账号状态、评分机会与外部恢复预算各有原有授权和验证路径。
改动思路 / Approach
保留现有 worker 的默认启动方式,将显式失败请求在调度器分支内校验完毕,再进入普通配额和会话准入。当前缺少失败证据的返回路径与普通启动共用,需要在显式分支封闭。 调度器选择磁盘阶段,Python provider 读回原进程、原生历史与当前配额,TypeScript Turn Journal 继续拥有共享重试判定,正常唤醒负责 Goal/Stop 和工作准入。 read_interrupted_host 与 native_interrupted_turn 要求 interrupted 状态和预算停止凭证。新读回复用同一 native 传输、工作区和 profile 绑定、已注册的 host_failure 及可选配额策略,单独验证结构化 quota_exhausted 尾部。 复用中断阶段的状态选择、原生读取器和 Turn 重试规则。仅为显式模式去掉未验证路径上的普通返回,保留现有自动路径与已有验证。
具体改动 / Changes
按 benchmark/README.md 在 1a309cc 的边界逐项核对。 benchmark/README.md
- retained_returned_failure · not_met。显式恢复只接受已保留的确切返回失败,然后进入新阶段。
- original_session_process_and_allowance · implemented。有有效返回失败时须用原会话和进程窗口,并检查当前配额。
- durable_finite_replay · implemented。重复同一请求沿用有限阶段并保留后续失败。
- ordinary_path · implemented。不带参数继续普通调度,硬配额失败仍无自动重试。
关键代码讲解
resume_state_file。选择本地阶段。缺失状态时直接返回根路径,绕过显式失败资格。 benchmark/runtime/scheduler.pymain。将选择结果交给真实外部 worker。当前没有区分正常路径与未验证的显式重试。 benchmark/runtime/scheduler.pyread_failed_host。校验原失败、精确回执、进程窗口、会话和配额读回。 benchmark/runtime/interruption_recovery.pyhostFailureRetryCheck。保留 Turn Journal 原语义并提供显式失败资格。 loopx/control_plane/turn_driver/host_failure.tsnative_failed_turn。读取稳定的失败尾部与结构化 quota 错误,原生记录保持 failed。 loopx/hosts/codex_checkpoint.py
14 个文件中,生产改动集中在阶段选择、失败来源及 native 只读证明。原有 Docker 归档归属保留,新的状态字段是传输回执。host_failure.retry 用于共享规则,显式请求以 digest 绑定一次操作。+630/-45,其中 273 行为新 Python 回归文件。
对主干的风险 / Risks
本地独立验证通过 95 个 Python 测试、跳过 4 个 Docker 或可选环境项目,TS head 60 项和基线 59 项均通过。两个新增端到端负例失败,说明已通过的套件没有覆盖未建立失败源的请求。生产 Python 通过编译和 Ruff,新测试中的 16 个 E701/E702 可在修复时一并展开。 用独立 SQLite 运行时、真实调度器与 worker 及隔离 native stand-in,两个输入各启动一个 Host 并写一条 wake receipt,均没有恢复阶段。第一处返回跳过失败检查,CLI 随即正常启动 worker。 省略参数时,两版在同一 SQLite fixture 的无状态和空状态上均走普通派发,各启动一个隔离 Host 并留一条收据。原 Journal 用例在两版通过,原 provider 默认启动不要求 allowance。 Docker 原归档验证有环境跳过,native 使用本地隔离替身,实时账号和 Docker 旧容器的完整迁移留待验证。
语义与 CI 对齐
README 与 --help 声明 exact-only,实际 CLI 在没有可恢复来源时仍交给正常 worker。修复后应让调用结果与当前说明一致。 失败取结构化 quota_exhausted,并复用原状态枚举。问题来自资格验证前返回,修复位置在调度器的派发前分支。 CI 未查询。复核命令为 uv run --extra test python -m pytest -q benchmark/tests/test_failed_host_continuation.py benchmark/tests/test_interruption_recovery.py benchmark/tests/test_stopped_recovery.py benchmark/tests/test_codex_readiness.py。
我的整体评价 / Verdict
有阻塞发现。 长期恢复原会话与失败证据的方向合理。当前调用可能在未建立失败来源时启动一次普通工作,使操作员失去这次请求的范围控制。 操作员会把参数理解为重试唯一失败。CLI 此时能无报错地产生普通唤醒,具体负例复现了一次额外 Host 启动。 检查范围是 benchmark CLI、状态、进程和协议读回,交互面为终端。 重新评审需要证明同一显式调用在无源与空源均停止,并验证普通默认启动及确切失败恢复仍通过。
English verdict: REQUEST_CHANGES. Head 8bc878b. An explicit failed retry without an original failed attempt can dispatch a normal Host wake. Require verified recovery before dispatch.
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · OpenAI · gpt-6.1-sol · runtime_reported · max
Request changes
[P1] 部分同阶段回执仍可绕过首次失败资格证明。原调度器文件有类型正确的 quota_exhausted 和匹配摘要。同一有限阶段的部分恢复文件只包含失败、会话与尝试计数,没有额度、原唤醒收据或 native 历史证明。。真实 scheduler CLI 对部分阶段返回 0,并 exec 隔离的 worker 见证。目录没有唤醒收据,字段没有额度或 native 历史证明。此前缺源和空源的两个 SQLite 负例均在新头阻断。。重放时要求首次 read_failed_host 已保留的可用额度、同一返回收据和原生游标摘要等必备事实,检查原物理收据和 SHA。增加缺证明的 exact-source 同阶段 CLI 负例,完整重放复用已确认结果。。
动机 / Motivation
使用 benchmark scheduler 继续已失败实验的操作员需要在账号配额恢复后,保留原实验会话、工作与已发生的成本。 旧调度器阻断硬配额失败。新模式应使用确切失败和恢复证明继续同一会话。新头拒绝首次缺源输入,同阶段的部分状态仍可启动 worker。 原始状态无效时,首次调用现在停止。同阶段恢复文件缺少首次资格见证时,派发依然发生。 本次范围是显式调度器恢复及其只读见证。推理、真实账号状态、评分机会与外部恢复预算各有原有授权和验证路径。
改动思路 / Approach
首次显式调用已封闭无源、不可读、锁竞争或无效 attempt 的返回。重放当前只比对原摘要、失败、计数和会话,未确认首次验证的实际返回、原生历史与额度。 调度器选择磁盘阶段,Python provider 读回原进程、原生历史与当前配额,TypeScript Turn Journal 继续拥有共享重试判定,正常唤醒负责 Goal/Stop 和工作准入。 read_interrupted_host 与 native_interrupted_turn 要求 interrupted 状态和预算停止凭证。新读回复用同一 native 传输、工作区和 profile 绑定、已注册的 host_failure 及可选配额策略,单独验证结构化 quota_exhausted 尾部。 复用 read_failed_host 已写入的回执形状与物理文件读回。把重放要求限制在初次恢复必须生成的证据,保持同一阶段的幂等性和默认启动。
具体改动 / Changes
按 benchmark/README.md 在 1a309cc 的边界逐项核对。 benchmark/README.md
- retained_returned_failure · implemented。首次恢复只接受已保留的确切返回失败。
- original_session_process_and_allowance · not_met。显式重放须保留可证实原资格的返回、原生和额度证据。
- durable_finite_replay · implemented。完整同阶段沿用有限截止时间并保留后续失败。
- ordinary_path · implemented。普通默认调度与硬配额停止语义保持。
关键代码讲解
_verify_failed_phase_replay。校验原文件摘要、失败、尝试和会话,仍接受缺少首次资格证据的阶段。 benchmark/runtime/scheduler.pyresume_state_file。同阶段接受验证结果便返回 phase,随后 CLI 启动 worker。 benchmark/runtime/scheduler.pyread_failed_host。首次资格包含原生读回和当前配额,并保存原收据及摘要。 benchmark/runtime/interruption_recovery.pyhostFailureRetryCheck。共享规则的状态输入与资格语义保持。 loopx/control_plane/turn_driver/host_failure.ts
14 个文件中,本轮修复只动 scheduler 及其新测试。显式首次分支拒绝前置检查失败,精确重放增加原失败源复核。全 PR +778/-53,原生、状态和共享规则边界保留。
对主干的风险 / Risks
新头独立通过 68 个 Python 测试,含原缺源和空源负例、默认路径、同会话继续、原字节篡改拒绝与原中断恢复。TS 60 项通过,新测试文件 Ruff 通过。独立 CLI 另一个负例表明无资格见证仍被重放。 真实 scheduler CLI 对部分阶段返回 0,并 exec 隔离的 worker 见证。目录没有唤醒收据,字段没有额度或 native 历史证明。此前缺源和空源的两个 SQLite 负例均在新头阻断。 省略显式参数时,两个实际 SQLite 用例仍分别普通派发一次,旧的 interrupted 恢复和共享 TS journal 用例也通过。 Docker 原归档验证有环境跳过,native 使用本地隔离替身,实时账号和 Docker 旧容器的完整迁移留待验证。
语义与 CI 对齐
文档要求先确切资格再允许显式恢复。现在重放返回值可以只凭部分状态启动 worker,与首次路径强制检查不同。 失败取结构化 quota_exhausted,并复用原状态枚举。问题来自资格验证前返回,修复位置在调度器的派发前分支。 CI 未查询。复核命令为 uv run --extra test python -m pytest -q benchmark/tests/test_failed_host_continuation.py benchmark/tests/test_interruption_recovery.py。
我的整体评价 / Verdict
有阻塞发现。 保留首次失败资格和阶段历史可以避免重复成本。现有重放缺口允许一个未完成证明的阶段进入派发。 操作员使用摘要后期待只继续已确证的阶段。部分恢复文件造成错误的成功退出和 worker 派发。 检查范围是 benchmark CLI、状态、进程和协议读回,交互面为终端。 保留首次修复,补齐同阶段证明重放,并复跑缺字段及完整原会话路径。
English verdict: REQUEST_CHANGES. Head dad55a9. The original missing-source path is fixed, but a partial same-phase replay can still dispatch without prior qualification evidence.
… replay Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · OpenAI · gpt-6.1-sol · runtime_reported · max
Approval
动机 / Motivation
使用 benchmark scheduler 继续已失败实验的操作员需要在账号配额恢复后,保留原实验会话、工作与已发生的成本。 旧调度器遇到硬配额失败保持阻断。新入口让操作员在配额修复后指明原失败,经证据校验继续同一会话。已验证阶段可以重放,缺失来源或未完成验证的阶段保持停止。 合格的返回失败生成同一会话上的有限阶段。复用该阶段须核对首次证据,缺失、变更或不匹配时不派发。 本次范围是显式调度器恢复及其只读见证。推理、真实账号状态、评分机会与外部恢复预算各有原有授权和验证路径。
改动思路 / Approach
保留 worker 的普通启动及 TypeScript 共享 Host 重试规则。首次显式恢复验证原失败的当前会话、原生历史和配额,写入绑定原失败的阶段。重放仅核对同一阶段已经记录的资格和本地返回收据。 调度器选择磁盘阶段,Python provider 读回原进程、原生历史与当前配额,TypeScript Turn Journal 继续拥有共享重试判定,正常唤醒负责 Goal/Stop 和工作准入。 read_interrupted_host 与 native_interrupted_turn 要求 interrupted 状态和预算停止凭证。新读回复用同一 native 传输、工作区和 profile 绑定、已注册的 host_failure 及可选配额策略,单独验证结构化 quota_exhausted 尾部。 同一回执的目标、模式、终态及 lane 校验交由 _verify_failed_wake。新增重放核验只消费当前已有证据,没有第二套重试规则、另一次 allowance RPC 或单独的授权存储。
具体改动 / Changes
按 benchmark/README.md 在 1a309cc 的边界逐项核对。 benchmark/README.md
- retained_returned_failure · implemented。首次恢复只接受已保留的确切返回失败。
- original_session_process_and_allowance · implemented。同一失败、回执和原生会话经验证,保存或复用已有额度证明。
- durable_finite_replay · implemented。完整同阶段保留有限期限、后续失败和原历史。
- ordinary_path · implemented。普通默认启动及硬配额停止语义保持。
关键代码讲解
_verify_failed_phase_replay。锁内核对原失败状态、会话和次数后,委托完整证据核验。 benchmark/runtime/scheduler.pyverify_failed_host_replay_witness。确认已保存正向额度、游标、原物理回执及当前原会话 profile,无新原生请求。 benchmark/runtime/interruption_recovery.pyread_failed_host。首次读取原失败进程窗、原生尾部和配额,生成该阶段核验所需证据。 benchmark/runtime/interruption_recovery.pyhostFailureRetryCheck。维持已注册失败规则,只决定重试资格。 loopx/control_plane/turn_driver/host_failure.ts
14 个文件。首次资格在调度器、原生及 stopped-source 路线中与普通准入分开。同阶段只读核对保存的原物理证据,不重复 model、账户或 allowance 请求。+900/-53,新增测试保护首次失败、完整重复阶段和 legacy 证明。
对主干的风险 / Risks
最终头独立 48 个 Python 测试通过,含三种旧反例、真实 SQLite 默认派发和原会话恢复,另有 60 个 TS 用例。编译、Ruff、diff 及双语 RFC 检查通过。作者的扩大合成套件记录 106 通过、一个 Docker opt-in 跳过。 同一真实 CLI 对缺源、空源各停止,真实 SQLite 路线零次 native、零条收据、零个新阶段。部分同阶段记录也停止,exec 见证未被调用。更换原字节或 wake receipt 后,已有阶段仍保持,重放被拒绝。 省略参数时,基线与最终 head 对相同两个实际 SQLite 输入各允许一次普通唤醒。原 interrupted 路径和旧 Journal 重试通过配对或未改源码验证。 Docker 原归档验证有环境跳过,native 使用本地隔离替身,实时账号和 Docker 旧容器的完整迁移留待验证。
语义与 CI 对齐
首次及重放的 CLI 行为与 README 的确切失败资格约束一致,摘要只指向原失败。复用失败和阶段词汇,未扩展评分或授权协议。 失败取结构化 quota_exhausted,并复用原状态枚举。问题来自资格验证前返回,修复位置在调度器的派发前分支。 CI 未查询。复核命令为 uv run --extra test python -m pytest -q benchmark/tests/test_failed_host_continuation.py benchmark/tests/test_interruption_recovery.py。
我的整体评价 / Verdict
未发现阻塞问题。 操作员能继续已合格的原失败并保留 session、失败证据与原语义 obligation。独立验证了选择与派发边界,保留真实账号和原 Docker 旧环境的验收范围。 明确摘要定位失败,错误或部分状态得到拒绝。已确认阶段重复请求复用原期限,普通启动不受这次显式复核影响。 检查范围是 benchmark CLI、状态、进程和协议读回,交互面为终端。 真实已保留失败的独立 session、初次拒绝和复核均覆盖。Docker 归档生产服务未在本轮独立执行,代码复用既有原容器证明路线。
English verdict: APPROVE. Head 7913153. The exact replay and first-dispatch gates preserve the original failure, session and deadline. No blocking findings.
A benchmark Host that returned
quota_exhaustedstayed held even after an operator repaired the account, because the outer scheduler had no equivalent of the shared Turn's explicit failed retry. This adds an explicit, digest-bound continuation of that exact failure into a separately admitted finite phase, preserving the original session, failure history and attempt count.The path verifies the returned wake and terminated process, current Goal/session/profile binding, stable native quota-failed cursor, and fresh account allowance through the existing native provider policy. Unknown or exhausted allowance stays held. A repeated request cannot erase a later failure in the new phase. The native cursor remains
failed; ordinary completed-checkpoint requirements, unresolved semantic replan holds, automatic quota holds, and default startup behavior remain unchanged.The shared TypeScript Host retry decision is reused by the Turn Journal and this caller. A stopped legacy container can supply the existing complete-source proof only for its exact returned quota failure; unknown failures, missing identities and cross-container copies remain refused. This does not recreate a missing workspace, reset scorer opportunities, switch accounts or infer a remaining budget. The existing operator supplies the independently authorized finite deadline. The stricter path requires the optional native Codex provider; its absence fails closed. No new persistent option or settings form is introduced.
Validation:
manual_review_requiredfor the benchmark-sensitive boundary; no merge readiness or authority is inferred. Bilingual RFC and whitespace checks passed.This PR intentionally targets the integration branch that owns its benchmark prerequisites, not main. Independent exact-head review and maintainer merge authorization remain separate.
Main target
This proposal now targets
mainas its independent 14-file continuation change. The interrupted source prerequisite and native receiver startup prerequisite are inmain. The source tree of the continuation is identical before and after dropping the now-landed receiver dependency from this proposal. The previous integration review remains available, and this main-target head needs its own review. Original stopped-source prerequisite #8208 · Receiver startup #8262Exact recovery source at the scheduler entry
The main-target review reproduced an explicit retry with either a missing scheduler file or the exact digest of an empty file. Both reached the actual worker, disposable SQLite quota and a native stand-in, which returned one wake without a recovery phase.
Explicit retry now holds before worker dispatch if phase selection is locked or the original state or Host attempt is missing or invalid. Same-phase replay checks the retained source bytes and the original returned native session and attempt before using the already-created phase. An ordinary invocation without the retry flag still selects its existing worker route.
The two matched SQLite/worker cases now return a refusal with no native invocation, wake receipt or phase. Eight targeted CLI regressions cover missing, malformed, locked and incomplete replay paths. The ordinary CLI path still invokes its worker. The focused scheduler/recovery suite passed 105 cases with one opt-in Docker test skipped, including same-session continuation, source immutability, Stop and finite retries.
Complete replay evidence
The second review reproduced a partially restored phase with the correct source digest, failure, session, attempt and deadline. It still reached the worker while missing the original allowance, wake receipt and native history witness.
An exact replay now requires the complete original qualification. It checks the retained receipt's bytes and returned attempt, the native history and positive allowance observations, and the original bound session profile through the existing readers. It reuses those saved observations without another account or native-history RPC. The ordinary worker still owns subsequent work admission.
All three matched CLI refusal cases now reach no worker or native Host. The focused scheduler and recovery suite passed 106 cases, with one opt-in Docker test skipped. A valid exact replay keeps the original session and count, rejects changed receipt bytes or removed evidence, and makes no new allowance or native-history observation.